#!/usr/bin/env node
import { PPTXExporter } from './dist/index.js';
import { readFile, writeFile, mkdir, stat } from 'fs/promises';
import { dirname, join } from 'path';
import { fileURLToPath } from 'url';
import { readFileSync } from 'fs';

const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);

// 解析命令行参数
function parseArgs(args) {
  const options = {
    inputFile: null,
    outputFile: 'exported-presentation.pptx',
    compression: false,
    verbose: false,
  };

  // 兼容两种格式：
  // 1. pptx-exporter input.json output.pptx -c -V
  // 2. pptx-exporter -i input.json -o output.pptx -c -V

  let i = 0;
  while (i < args.length) {
    const arg = args[i];

    switch (arg) {
      case '-i':
      case '--input':
        options.inputFile = args[++i];
        break;
      case '-o':
      case '--output':
        options.outputFile = args[++i];
        break;
      case '-c':
      case '--compression':
        options.compression = true;
        break;
      case '-V':
      case '--verbose':
        options.verbose = true;
        break;
      default:
        // 如果不是选项，则按位置参数处理
        if (!arg.startsWith('-')) {
          if (!options.inputFile) {
            options.inputFile = arg;
          } else if (options.outputFile === 'exported-presentation.pptx') {
            options.outputFile = arg;
          }
        }
        break;
    }
    i++;
  }

  return options;
}

// 读取package.json获取版本号
function getVersion() {
  try {
    const packageJsonPath = join(__dirname, 'package.json');
    const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8'));
    return packageJson.version;
  } catch (error) {
    return 'unknown';
  }
}

async function main() {
  const args = process.argv.slice(2);

  if (args.includes('--version') || args.includes('-v')) {
    showVersion();
    return;
  }

  if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
    showHelp();
    return;
  }

  try {
    // 解析参数
    const options = parseArgs(args);
    const { inputFile, outputFile, compression, verbose } = options;

    // 验证必需参数
    if (!inputFile) {
      console.error('❌ 错误: 缺少输入文件');
      console.error('用法: pptx-exporter <输入文件> [输出文件] [选项]');
      console.error('  或: pptx-exporter -i <输入文件> -o [输出文件] [选项]');
      process.exit(1);
    }

    if (verbose) {
      console.log('🔍 开始处理...');
      console.log(`📁 输入文件: ${inputFile}`);
      console.log(`📄 输出文件: ${outputFile}`);
      console.log(`🗜️  压缩: ${compression ? '启用' : '禁用'}`);
    }

    // 读取输入文件
    const data = JSON.parse(await readFile(inputFile, 'utf-8'));

    if (verbose) {
      console.log('✅ 输入文件读取成功');
      console.log(`📊 数据大小: ${JSON.stringify(data).length} 字符`);
    }

    // 确保输出目录存在
    const outputDir = dirname(outputFile);
    if (outputDir !== '.') {
      try {
        // 检查目录是否已存在
        try {
          await stat(outputDir);
        } catch (statError) {
          // 目录不存在，尝试创建
          await mkdir(outputDir, { recursive: true });
          if (verbose) {
            console.log(`📁 创建输出目录: ${outputDir}`);
          }
        }
      } catch (error) {
        if (error.code !== 'EEXIST') {
          console.warn(`⚠️  无法创建输出目录 ${outputDir}: ${error.message}`);
          // 继续执行，让 toFile 方法处理路径问题
        }
      }
    }

    // 创建导出器
    const exporter = new PPTXExporter(data, {
      onProgress: progress => {
        if (verbose) {
          const { current, total, percentage, completed } = progress;
          const barLength = 30;
          const filledLength = Math.round((percentage / 100) * barLength);
          const bar =
            '█'.repeat(filledLength) + '░'.repeat(barLength - filledLength);

          process.stdout.clearLine(0);
          process.stdout.cursorTo(0);
          process.stdout.write(
            `[${bar}] ${percentage}% | ${current}/${total} 张幻灯片`
          );

          if (completed) {
            console.log(' | ✅ 完成');
          }
        }
      },
    });

    if (verbose) {
      console.log(`🌍 当前环境: ${exporter.getEnvironment()}`);
      console.log(
        `📋 支持的格式: ${exporter.getSupportedFormats().join(', ')}`
      );
      console.log('📊 开始导出...');
    }

    // 导出文件
    await exporter.toFile(outputFile, compression);

    console.log(`✅ PPTX 文件已成功导出到: ${outputFile}`);

    if (verbose) {
      // 获取文件大小
      try {
        const fileStats = await stat(outputFile);
        console.log(
          `📊 文件大小: ${(fileStats.size / 1024 / 1024).toFixed(2)} MB`
        );
      } catch (e) {
        // 忽略文件大小获取错误
      }
    }
  } catch (error) {
    console.error('❌ 导出失败:', error.message);
    if (args.includes('--verbose') || args.includes('-V')) {
      console.error('错误堆栈:', error.stack);
    }
    process.exit(1);
  }
}

function showVersion() {
  const version = getVersion();
  console.log(`
📊 PPTX Exporter CLI v${version}

一个强大的PPTX导出工具，用于将幻灯片数据转换为PowerPoint演示文稿。
基于PPTist项目开发，为PPTist在线演示应用提供无界面导出功能。

🌐 项目地址: https://gitee.com/devoink/pptx-exporter
📄 许可证: MIT
👨‍💻 作者: devoink

支持环境:
  - Node.js: 支持所有导出格式
  - 浏览器: 支持 Blob, Base64, ArrayBuffer
  - Deno: 支持 ArrayBuffer, Uint8Array
  - Bun: 支持 Buffer, ArrayBuffer, Uint8Array
`);
}

function showHelp() {
  console.log(`
📊 PPTX Exporter CLI

用法: 
  pptx-exporter <输入文件> [输出文件] [选项]
  pptx-exporter -i <输入文件> -o [输出文件] [选项]

参数:
  <输入文件>     JSON格式的演示文稿数据文件
  [输出文件]     输出的PPTX文件名 (默认: exported-presentation.pptx)

选项:
  -i, --input <文件>    指定输入文件
  -o, --output <文件>   指定输出文件
  -c, --compression     启用压缩 (减小文件大小)
  -V, --verbose         显示详细信息
  -v, --version         显示版本信息
  -h, --help           显示帮助信息

示例:
  # 位置参数方式
  pptx-exporter data.json
  pptx-exporter data.json presentation.pptx
  pptx-exporter data.json presentation.pptx --compression
  pptx-exporter data.json presentation.pptx --compression --verbose

  # 命名参数方式
  pptx-exporter -i data.json
  pptx-exporter -i data.json -o presentation.pptx
  pptx-exporter -i data.json -o presentation.pptx -c -V
  pptx-exporter --input data.json --output presentation.pptx --compression --verbose

环境支持:
  - Node.js: 支持所有导出格式
  - 浏览器: 支持 Blob, Base64, ArrayBuffer
  - Deno: 支持 ArrayBuffer, Uint8Array
  - Bun: 支持 Buffer, ArrayBuffer, Uint8Array

更多信息请访问: https://gitee.com/devoink/pptx-exporter
`);
}

main().catch(console.error);
